 /**
 * Description: 生成业务表vo
 * Copyright:Copyright 2018 nfky.com. All rights reserved
 * @author:xk
 * @since:0.0.1
 * Create at:2018-01-18 下午 16:03:50
 *  
 * Modification History:
 * Date         Author      Version     Description
 * ------------------------------------------------------------------
 * 2018-01-18   xk       0.0.1     Initial
 */
package com.metro.generator.gen.beans.vo;

import com.metro.activation.common.beans.constant.DicTypeEnum;
import com.metro.activation.common.utils.DicUtil;
import com.metro.generator.gen.beans.constant.ColumnPosition;
import com.metro.generator.gen.beans.entity.GenTableEntity;
import com.metro.utils.CollectionUtil;
import com.metro.utils.StringUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

 /**
 * 生成业务表vo<br>
 *
 * @author xk
 * @since [0.0.1]
 * @version [0.0.1, 2018-01-18]
 */
@Data()
@EqualsAndHashCode(callSuper = false)
public class GenTable extends GenTableEntity {

     /**
      * 项目信息
      */
    private GenProject project;
     /**
      * 表字段
      */
    List<GenTableColumn> columns;

     /**
      * 字段名、变量名：className 首字母小写。 HelloWord > helloWord
      * @return
      */
    public String getFieldName(){
        return this.getClassName().substring(0, 1).toLowerCase() + this.getClassName().substring(1);
    }
     /**
      * 获取项目名
      * @return
      */
    public String getProjectName(){
        return DicUtil.getName(DicTypeEnum.GEN_PROJECT, this.getProjectId());
    }

    public String getIsConfigStr(){
        return DicUtil.getName(DicTypeEnum.YES_OR_NO, this.getIsConfig());
    }

     public void setColumnsTableId() {
        if(CollectionUtil.isNotEmpty(columns)){
            for (GenTableColumn column : columns){
                column.setGenTableId(super.getId());
            }
        }
     }

     /**
      * 插入编辑字段列表
      */
     public List<GenTableColumn> getInsertColumns(){
         return getColumnsByColumnPosition(ColumnPosition.INSERT);
     }

     /**
      * 插入编辑字段列表
      */
     public List<List<GenTableColumn>> getInsertColumnRows(){
         return columnToRows(this.getColumnNum(), getInsertColumns());

     }

     /**
      * 把列表按每行个数整理
      * @param columnNum 每行个数
      * @param list
      * @return
      */
     private List<List<GenTableColumn>> columnToRows(int columnNum, List<GenTableColumn> list){
         List<List<GenTableColumn>> rows = new ArrayList<>();
         int index = 0;
         List<GenTableColumn> tempList = null;
         for(GenTableColumn column : list){
             if(index % columnNum == 0){
                 tempList = new ArrayList<>();
                 rows.add(tempList);
             }
             tempList.add(column);
             index ++;
         }
         return rows;
     }

     /**
      * 列表字段列表
      */
     public List<GenTableColumn> getListColumns(){
         return getColumnsByColumnPosition(ColumnPosition.LIST);
     }

     /**
      * 查询字段列表
      */
     public List<GenTableColumn> getQueryColumns(){
         return getColumnsByColumnPosition(ColumnPosition.QUERY);
     }

     /**
      * 查询字段列表
      */
     public List<List<GenTableColumn>> getQueryColumnRows(){
         return columnToRows(2, getQueryColumns());
     }

     /**
      * 返回字段列表
      */
     List<GenTableColumn> getColumnsByColumnPosition(ColumnPosition position){
         List<GenTableColumn> list = new ArrayList<>();
         if(CollectionUtil.isNotEmpty(this.columns)){
             for (GenTableColumn column : this.columns) {
                 switch (position){
                     case INSERT:
                         if(column.getIsInsert()){
                             list.add(column);
                         }
                         break;
                     case LIST:
                         if(column.getIsList()){
                             list.add(column);
                         }
                         break;
                     case QUERY:
                         if(column.getIsQuery()){
                             list.add(column);
                         }
                         break;
                     case INFO:
                         if(column.getIsInfo()){
                             list.add(column);
                         }
                         break;
                     default:
                         break;
                 }
             }
         }

         return list;
     }


     /**
      * 数据字典字段列表
      */
     public List<GenTableColumn> getDicColumns(){
         List<GenTableColumn> list = new ArrayList<>();
         if(CollectionUtil.isNotEmpty(columns)){
             for(GenTableColumn column : columns){
                 if(StringUtil.isNotEmpty(column.getDicType())){
                     list.add(column);
                 }
             }
         }
         return list;
     }

     /**
      * 数据字典包名列表
      */
     public Set<String> getDicPackages(){
         List<GenTableColumn> list = getDicColumns();
         Set<String> pkgs = new HashSet<>();
         if(CollectionUtil.isNotEmpty(list)){
             for(GenTableColumn column : list){
                 pkgs.add(column.getDicTypePackage());
             }
         }
         return pkgs;
     }
 }
